package gretha.GUI;

import gretha.donnees.Arbre;
import gretha.donnees.Cohorte;
import gretha.donnees.Modification;
import gretha.donnees.Prelevement;
import gretha.excel.FiltreFichier;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;

import javax.swing.ImageIcon;
import javax.swing.JFileChooser;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;

import jxl.NumberCell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;

/**
 * 
 * Menu de l'application permettant diverses actions
 *
 */
public class Menu extends JMenuBar{

	private static final long serialVersionUID = 2277308043630042541L;

	private JMenu menuFichier;

	private JMenu menuCohortes;

	private JMenu menuMassifs;

	private JMenu menuScenario;

	private JMenu menuProduits;
	
	private JMenu menuPrixDuBois;
	
	private FenetrePrincipale parent;

	public Menu(FenetrePrincipale parent){
		//Appel la fonction JMenuBar du parent() 
		super();

		this.parent = parent;

		//On créé le JMenu Fichier
		menuFichier = creerMenuFichier();
		//On créé le JMenu Cohorte
		menuCohortes = creerMenuCohortes();
		//On créé le JMenu Massif
		menuMassifs = creerMenuMassifs();
		//On créé le JMenu Scenario
		menuScenario = creerMenuScenario();
		//On créé le JMenu produits
		menuProduits = creerMenuProduits();
		//On créé le JMenu PrixDuBois
		menuPrixDuBois = creerMenuPrixDuBois();
		
		//On ajoute le menu à notre JMenuBar (hérité par notre classe Menu)
		this.add(menuFichier);
		this.add(menuCohortes);
		this.add(menuMassifs);
		this.add(menuScenario);
		this.add(menuProduits);
		this.add(menuPrixDuBois);
	}

	private JMenu creerMenuProduits() {
		JMenu menuProduits = new JMenu();

		menuProduits.setText("Produits");

		JMenuItem miCreerProduit = creerBoutonCreerProduit();
		JMenuItem miModifierProduit = creerBoutonModifierProduit();
		JMenuItem miSupprimerProduit = creerBoutonSupprimerProduit();
		JMenuItem miAfficherProduits = creerBoutonAfficherProduits();
		
		menuProduits.add(miCreerProduit);
		menuProduits.add(miModifierProduit);
		menuProduits.add(miSupprimerProduit);
		menuProduits.add(miAfficherProduits);
		
		return menuProduits;
	}
	
	private JMenu creerMenuPrixDuBois() {
		JMenu menuPrixDuBois = new JMenu();

		menuPrixDuBois.setText("PrixDuBois");

		JMenuItem miAfficherPrixDuBois = creerBoutonAfficherPrixDuBois();
		JMenuItem miModifierPrixDuBois = creerBoutonModifierPrixDuBois();
		
		menuPrixDuBois.add(miAfficherPrixDuBois);
		menuPrixDuBois.add(miModifierPrixDuBois);
		
		return menuPrixDuBois;
	}

	private JMenu creerMenuScenario() {
		JMenu menuScenario = new JMenu();

		menuScenario.setText("Scenario");

		JMenuItem miCreerUnScenario = creerBoutonCreerUnScenario();
		JMenuItem miChargerUnScenario = creerBoutonChargerUnScenario();
		
		menuScenario.add(miCreerUnScenario);
		menuScenario.add(miChargerUnScenario);
		
		return menuScenario;
	}

	private JMenu creerMenuMassifs() {
		JMenu menuMassifs = new JMenu();

		menuMassifs.setText("Massifs");

		//On créé les boutons
		JMenuItem miAfficherMassifs = creerBoutonCreerMassifs();
		JMenuItem miModifierMassifs = creerBoutonModifierMassif();
		JMenuItem miSupprimerMassifs = creerBoutonSupprimerMassif();

		//On les ajoutes à notre menu
		menuMassifs.add(miAfficherMassifs);
		menuMassifs.add(miModifierMassifs);
		menuMassifs.add(miSupprimerMassifs);

		return menuMassifs;
	}

	private JMenu creerMenuCohortes() {
		JMenu menuCohortes = new JMenu();

		menuCohortes.setText("Cohortes");

		//On créé les boutons
		JMenuItem miAfficherCohortes = creerBoutonAfficherCohortes();
		JMenuItem miModifierCohorte = creerBoutonModifierCohorte();
		JMenuItem miSupprimerCohorte = creerBoutonSupprimerCohorte();

		//On les ajoutes à notre menu
		menuCohortes.add(miAfficherCohortes);
		menuCohortes.add(miModifierCohorte);
		menuCohortes.add(miSupprimerCohorte);

		return menuCohortes;
	}

	private JMenu creerMenuFichier()
	{
		JMenu menuFichier = new JMenu();

		menuFichier.setText("Fichier");

		//On créé les boutons
		JMenuItem miImporterCohorte = creerBoutonImporterCohorte();
		JMenuItem miQuitter = creerBoutonQuitter();

		//On les ajoutes à notre menu
		menuFichier.add(miImporterCohorte);
		menuFichier.addSeparator();
		menuFichier.add(miQuitter);

		return menuFichier;
	}

	private JMenuItem creerBoutonImporterCohorte()
	{
		JMenuItem retour = new JMenuItem();
		retour.setText("Importer une cohorte");

		java.awt.event.ActionListener importerCohorte = new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent e) {
				FiltreFichier filtreExcel = new FiltreFichier(new String[]{"xls"},"les fichiers excel (*.xls)");
				JFileChooser choix = new JFileChooser();
				choix.addChoosableFileFilter(filtreExcel);
				int retour=choix.showOpenDialog(getParent());
				if(retour==JFileChooser.APPROVE_OPTION){
					// un fichier a été choisi (sortie par OK)
					// nom du fichier  choisi 
					choix.getSelectedFile().getName();
					// chemin absolu du fichier choisi
					String fichierChoisi = choix.getSelectedFile().getAbsolutePath();
					importerCohorte(fichierChoisi);

				}else {
					System.out.println("pas de fichier");	

				}
			}

			private void importerCohorte(String fichierChoisi) {
				File fichierXLS = new File(fichierChoisi);
				try {
					//On ouvre le fichier Excel
					Workbook workbook = Workbook.getWorkbook(fichierXLS);
					//On ouvre la feuille de calcul 0
					Sheet feuilleDeCalcul = workbook.getSheet(0); 
					
					//On Initialise nos tableaux
					ArrayList<Modification> modifications = new ArrayList<Modification>();
					ArrayList<Arbre> arbres = new ArrayList<Arbre>();
					ArrayList<Prelevement> prelevements = new ArrayList<Prelevement>();
					
					//On initialise notre variable de parcours et notre String de stockage temporaire
					int numeroLigne = 2;
					int nbtiges;
					String tauxTemporaire;
					double volumeUnitaire = 0;
					double tauxDeMortalite = 0;
					double tauxDePrelevement = 0; 
					
					//On recupere la valeur de la case 0,0 (nom de la cohorte)
					String nomCohorte = feuilleDeCalcul.getCell(0,0).getContents();
					//recuperer le nom de l arbre (case 3,0)
					String nomArbre = feuilleDeCalcul.getCell(3,0).getContents();
					arbres.add(new Arbre(nomArbre));
					
					//On lit en boucle
					try{
						do{
						int annee = Integer.parseInt(feuilleDeCalcul.getCell(0,numeroLigne).getContents());
						tauxTemporaire = feuilleDeCalcul.getCell(4,numeroLigne).getContents();
						if(!tauxTemporaire.isEmpty())
						{
							tauxTemporaire = tauxTemporaire.substring(0, tauxTemporaire.lastIndexOf('%'));
							tauxDePrelevement = Double.parseDouble(tauxTemporaire);
							prelevements.add(new Prelevement(tauxDePrelevement,0.0,0.0,annee));
						}
						else
						{
							tauxDePrelevement = 0;
						}
						nbtiges = Integer.parseInt(feuilleDeCalcul.getCell(1,numeroLigne).getContents());
						tauxDeMortalite = ((NumberCell)feuilleDeCalcul.getCell(2,numeroLigne)).getValue() / nbtiges;
						volumeUnitaire = ((NumberCell)feuilleDeCalcul.getCell(3,numeroLigne)).getValue();
						modifications.add(new Modification(annee,volumeUnitaire,tauxDeMortalite));

						//On passe à la ligne suivante
						numeroLigne++;
					}
					while(!feuilleDeCalcul.getCell(0,numeroLigne).getContents().isEmpty());
					}
					catch(ArrayIndexOutOfBoundsException e)
					{
						System.err.println("Out of bound fichier xls");
					}
					workbook.close(); 	

					Cohorte nouvelleCohorte = new Cohorte(nomCohorte,arbres,modifications,prelevements);
					
					nouvelleCohorte.sauvegarderEnBase();	
					
					parent.getPartieCentrale().afficherSauvegardeEffectuee(nouvelleCohorte.getNom());
					
				} catch (BiffException e) {
					e.printStackTrace();
				} catch (IOException e) {
					e.printStackTrace();
				} 

			}
		};

		retour.addActionListener(importerCohorte);
		retour.setEnabled(true);	

		return retour;
	}

	private JMenuItem creerBoutonQuitter()
	{
		JMenuItem retour = new JMenuItem();

		retour.setText("Quitter");
		retour.setIcon(new ImageIcon("res/Images/sortie.png"));
		//On y attache un actionListenner qui va détecter qu'on a cliqué ou fait entré dessus le menuItem Quitter
		java.awt.event.ActionListener action = new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent e) {
				//Ferme l'application (le processus)
				System.exit(0);
			}
		};
		retour.addActionListener(action);
		//Actif
		retour.setEnabled(true);

		return retour;
	}

	private JMenuItem creerBoutonAfficherCohortes() {
		JMenuItem retour = new JMenuItem();

		retour.setText("Afficher une Cohorte");
		//retour.setIcon(new ImageIcon("res/Images/sortie.png"));
		//On y attache un actionListenner qui va détecter qu'on a cliqué ou fait entré dessus le menuItem Quitter
		java.awt.event.ActionListener action = new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent e) {
				parent.getPartieCentrale().afficherCohortes();
			}
		};
		retour.addActionListener(action);
		//Actif
		retour.setEnabled(true);

		return retour;
	}

	private JMenuItem creerBoutonModifierCohorte() {
		JMenuItem retour = new JMenuItem();

		retour.setText("Modifier une Cohorte");
		//retour.setIcon(new ImageIcon("res/Images/sortie.png"));
		//On y attache un actionListenner qui va détecter qu'on a cliqué ou fait entré dessus le menuItem Quitter
		java.awt.event.ActionListener action = new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent e) {
				parent.getPartieCentrale().modifierCohorte();
			}
		};
		retour.addActionListener(action);
		//Actif
		retour.setEnabled(true);

		return retour;
	}

	private JMenuItem creerBoutonSupprimerCohorte() {
		JMenuItem retour = new JMenuItem();

		retour.setText("Supprimer une Cohorte");
		//retour.setIcon(new ImageIcon("res/Images/sortie.png"));
		//On y attache un actionListenner qui va détecter qu'on a cliqué ou fait entré dessus le menuItem Quitter
		java.awt.event.ActionListener action = new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent e) {
				parent.getPartieCentrale().supprimerCohorte();
			}
		};
		retour.addActionListener(action);
		//Actif
		retour.setEnabled(true);

		return retour;
	}

	private JMenuItem creerBoutonCreerMassifs() {
		JMenuItem retour = new JMenuItem();

		retour.setText("Créer un Massif");
		//retour.setIcon(new ImageIcon("res/Images/sortie.png"));
		//On y attache un actionListenner qui va détecter qu'on a cliqué ou fait entré dessus le menuItem Quitter
		java.awt.event.ActionListener action = new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent e) {
				parent.getPartieCentrale().creerMassifs();
			}
		};
		retour.addActionListener(action);
		//Actif
		retour.setEnabled(true);

		return retour;
	}

	private JMenuItem creerBoutonModifierMassif() {
		JMenuItem retour = new JMenuItem();

		retour.setText("Modifier un Massif");
		//retour.setIcon(new ImageIcon("res/Images/sortie.png"));
		//On y attache un actionListenner qui va détecter qu'on a cliqué ou fait entré dessus le menuItem Quitter
		java.awt.event.ActionListener action = new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent e) {
				parent.getPartieCentrale().modifierMassif();
			}
		};
		retour.addActionListener(action);
		//Actif
		retour.setEnabled(true);

		return retour;
	}

	private JMenuItem creerBoutonSupprimerMassif() {
		JMenuItem retour = new JMenuItem();

		retour.setText("Supprimer un Massif");
		//retour.setIcon(new ImageIcon("res/Images/sortie.png"));
		//On y attache un actionListenner qui va détecter qu'on a cliqué ou fait entré dessus le menuItem Quitter
		java.awt.event.ActionListener action = new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent e) {
				parent.getPartieCentrale().supprimerMassif();
			}
		};
		retour.addActionListener(action);
		//Actif
		retour.setEnabled(true);

		return retour;
	}
	
	private JMenuItem creerBoutonCreerUnScenario(){
		JMenuItem retour = new JMenuItem();

		retour.setText("Créer un scenario");

		java.awt.event.ActionListener action = new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent e) {
				parent.getPartieCentrale().creerScenario();
			}
		};
		retour.addActionListener(action);
		//Actif
		retour.setEnabled(true);

		return retour;
	}
	
	private JMenuItem creerBoutonChargerUnScenario(){
		JMenuItem retour = new JMenuItem();

		retour.setText("Charger un scenario");

		java.awt.event.ActionListener action = new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent e) {
				parent.getPartieCentrale().chargerScenario();
			}
		};
		retour.addActionListener(action);
		//Actif
		retour.setEnabled(true);

		return retour;
	}
	
	private JMenuItem creerBoutonAfficherPrixDuBois(){
		JMenuItem retour = new JMenuItem();

		retour.setText("Afficher prix du bois");

		java.awt.event.ActionListener action = new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent e) {
				parent.getPartieCentrale().afficherPrixDuBois();
			}
		};
		retour.addActionListener(action);
		//Actif
		retour.setEnabled(true);

		return retour;
	}
	
	private JMenuItem creerBoutonModifierPrixDuBois(){
		JMenuItem retour = new JMenuItem();

		retour.setText("Modifier prix du bois");

		java.awt.event.ActionListener action = new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent e) {
				parent.getPartieCentrale().modifierPrixDuBois();
			}
		};
		retour.addActionListener(action);
		//Actif
		retour.setEnabled(true);

		return retour;
	}
	
	private JMenuItem creerBoutonCreerProduit(){
		JMenuItem retour = new JMenuItem();

		retour.setText("Créer un produit");

		java.awt.event.ActionListener action = new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent e) {
				parent.getPartieCentrale().creerProduit();
			}
		};
		retour.addActionListener(action);
		//Actif
		retour.setEnabled(true);

		return retour;
	}
	
	private JMenuItem creerBoutonModifierProduit(){
		JMenuItem retour = new JMenuItem();

		retour.setText("Modifier produit");

		java.awt.event.ActionListener action = new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent e) {
				parent.getPartieCentrale().modifierProduit();
			}
		};
		retour.addActionListener(action);
		//Actif
		retour.setEnabled(true);

		return retour;
	}
	
	private JMenuItem creerBoutonSupprimerProduit(){
		JMenuItem retour = new JMenuItem();

		retour.setText("SupprimerProduit");

		java.awt.event.ActionListener action = new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent e) {
				parent.getPartieCentrale().supprimerProduit();
			}
		};
		retour.addActionListener(action);
		//Actif
		retour.setEnabled(true);

		return retour;
	}
	
	private JMenuItem creerBoutonAfficherProduits(){
		JMenuItem retour = new JMenuItem();

		retour.setText("Afficher l'arborescence des produits");

		java.awt.event.ActionListener action = new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent e) {
				parent.getPartieCentrale().afficherProduits();
			}
		};
		retour.addActionListener(action);
		//Actif
		retour.setEnabled(true);

		return retour;
	}
	

}
